from flask import Flask, render_template, request
import pandas as pd
import cufflinks as cf
import plotly as py
import plotly.graph_objs as go

app = Flask(__name__)


# 读数据
def read_data():
    return pd.read_csv("hurun_unicorn.tsv",
                       sep="\t",
                       engine="python",
                       encoding="utf8",
                       header=0,
                       )


df = read_data()
df.index.name = "序号"
# 筛选数据目标（处理数据）
欧盟国家 = ["法国", "德国", "意大利", "荷兰", "比利时", "卢森堡", "爱尔兰", "英国", "丹麦", "希腊", "西班牙", "葡萄牙", "芬兰", "瑞典", "奥地利", "爱沙尼亚",
        "拉脱维亚", "立陶宛", "波兰", "捷克", "匈牙利", "斯洛伐克", "斯洛文尼亚", "马耳他", "塞浦路斯", "罗马尼亚", "保加利亚"]
欧盟 = df[df['国家'].isin(欧盟国家)]
欧盟.insert(欧盟.shape[1], '地区分布', "欧盟", allow_duplicates=False)
亚太国家 = ["中国", "日本", "韩国", "朝鲜", "菲律宾", "马来西亚", "印度尼西亚", "新加坡", "澳大利亚", "新西兰"]
亚太 = df[df['国家'].isin(亚太国家)]
亚太.insert(亚太.shape[1], '地区分布', "亚太地区", allow_duplicates=False)
其它地区 = ["美国", "加拿大", "巴西", "以色列", "阿根廷", "爱沙尼亚", "西班牙", "新西兰", "哥伦比亚"]
其它 = df[df['国家'].isin(其它地区)]
其它.insert(其它.shape[1], '地区分布', "其它地区", allow_duplicates=False)
# 合并表格
分类处理数据 = pd.concat([欧盟, 亚太, 其它])

# 首页，展示数据处理后的全部数据
@app.route('/entry')
def category() -> 'html':
    # 筛选数据目标（处理数据）
    df_all = 分类处理数据.to_html()
    # 筛选目标
    category_list = ['欧盟','亚太地区','其它地区']
    res = category_list
    return render_template("results2.html",
                           category_all_list=res,
                           the_res= df_all,
                           )

# 展示数据筛选后的数据和图表
@app.route('/hurun',methods=['POST'])
def hurun_select() -> 'html':
    category_list = ['欧盟', '亚太地区', '其它地区']
    res = category_list
    choose = request.form["category_list"]
    print(choose) # 检查用户输入
    if choose in category_list:
        place_choose=分类处理数据[分类处理数据['地区分布'].isin([choose])]
        地区行业数据 = place_choose[['国家','城市', '企业名称', '估值（亿人民币）', '成立年份', '行业', '掌门人/创始人','地区分布']] \
            .groupby(['国家','城市', '行业','成立年份','掌门人/创始人']) \
            .agg({'估值（亿人民币）': 'sum', '企业名称': 'count'}) \
            .sort_values(['企业名称'], ascending=False) \
            .rename(columns={"企业名称": "企业数量"}) \
            .reset_index()
    print(地区行业数据.head(5)) # 在后台检查描述性统计
    # 交互式可视化画图
    fig = 地区行业数据.iplot(kind="bar", x="行业", y="估值（亿人民币）", asFigure=True)
    py.offline.plot(fig,  filename="example.html",auto_open=False)
    with open("example.html", encoding="utf8", mode="r") as f:
        plot_all = "".join(f.readlines())
    data_str = 地区行业数据.to_html()
    return render_template('results2.html',
                            the_plot_all = plot_all,
                            the_res = data_str,
                            category_all_list=res,
                           )

# 中国城市独角兽企业估值情况
@app.route('/Chinese cities')
# 视图函数
def get_Chinese_cities():
    中国 = df[df['国家'].isin(['中国'])]
    城市情况 = 中国[['城市', '企业名称', '估值（亿人民币）', '成立年份', '行业','掌门人/创始人','部分投资机构']].groupby(['城市', '行业', '成立年份','掌门人/创始人','部分投资机构']).agg(
        {'估值（亿人民币）': 'sum', '企业名称': 'count'}).sort_values(['估值（亿人民币）', '企业名称'], ascending=False).rename(
        columns={"企业名称": "企业数量"}).reset_index()
    fig = 城市情况.iplot(kind="bar", x="城市", y="估值（亿人民币）", asFigure=True)
    py.offline.plot(fig, filename="example.html", auto_open=False)
    with open("example.html", encoding="utf8", mode="r") as f:
        plot_all = "".join(f.readlines())
        data_str = 城市情况.to_html()
        return render_template('base.html',   # 要改html
                       the_plot_all=plot_all,
                       the_res=data_str,
                       )

@app.route('/entry2')
def choose() -> 'html':
    df = read_data()
    # 筛选目标
    国家=pd.unique(df['国家'])
    country_list = list(set(国家))
    行业 = pd.unique(df['行业'])
    industry_list = list(set(行业))
    成立年份 = pd.unique(df['成立年份'])
    time_list = list(set(成立年份))

    res1 = country_list
    res2 = industry_list
    res3 = time_list
    df_all = df.to_html(classes="pure-table", index=False)
    return render_template("results.html",
                           country_list=res1,
                           industry_list=res2,
                           time_list=res3,
                           the_res=df_all,
                           )

# 国家、行业、年份筛选器
@app.route('/Sifting',methods=['POST'])
def hurun_sifting() -> 'html':
    df = read_data()
    print(df)
    df[["成立年份"]] = df[["成立年份"]].astype(str)
    成立年份_list = df['成立年份'].tolist()
    print(成立年份_list)

    行业 = pd.unique(df['行业'])
    industry_list = list(set(行业))
    成立年份 = pd.unique(df['成立年份'])
    time_list = list(set(成立年份))
    国家 = pd.unique(df['国家'])
    country_list = list(set(国家))
    res1=country_list
    res2=industry_list
    res3=time_list
    country = request.form["countrylist"]
    industry= request.form["industrylist"]
    time= request.form["timelist"]
    print(country)  # 检查用户输入
    print(industry)
    print(time)
    df_choose = df[(df['国家'] == country) & (df['行业'] == industry) & (df['成立年份'] == time)]
    print(df_choose)


        # 交互式画图
    if country in country_list :
        df_choose = df[(df['国家'] == country) & (df['行业'] == industry) & (df['成立年份'] == time)]
        print(df_choose)
        fig = df_choose.iplot(kind="bar", x="城市", y="估值（亿人民币）", asFigure=True)
        py.offline.plot(fig,  filename="example.html",auto_open=False)

    with open("example.html", encoding="utf8", mode="r") as f:
        plot_all = "".join(f.readlines())
    data_str =df_choose.to_html(classes="pure-table", index=False)
    return render_template('results.html',
                           res = df_choose,
                           the_plot_all = plot_all,
                           the_res = data_str,
                           country_list=res1,
                           industry_list=res2,
                           time_list=res3,
                           )

if __name__ == '__main__':
            app.run(debug=True)




